package Pruebas;

import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.StringTokenizer;

import javax.swing.JFileChooser;

import Hibernate.Cliente;
import Hibernate.Dueno;
import Hibernate.Presupuesto;
import Hibernate.Vehiculo;
import Logica.ClienteLogica;
import Logica.DuenoLogica;
import Logica.PresupuestoLogica;
import Logica.VehiculoLogica;
import Logica.Validacion.PresupuestoValidacion;
import Logica.Validacion.Validacion;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

public class GeneraPresupuesto {

 private BaseFont bfBold;
 private BaseFont bf;
 private int pageNumber = 0;
 private JFileChooser selecciona_archivo;
 //72 puntos es una pulgada.
 int xMin, xMax, yMin, yMax;
 public int yLineaDesc;
	
 private Font f30, f20;
 
 public GeneraPresupuesto(String[] args) {
	super();
	//margenes
	xMin = 72;
	yMin = 72;
	
	f30 = new Font();
	f20 = new Font();
	
	f30.setSize(30);
	f20.setSize(20);
	
	
	
	String pdfFilename = "";
	selecciona_archivo = new JFileChooser();
	selecciona_archivo.showSaveDialog(null);
	pdfFilename = selecciona_archivo.getSelectedFile().toString();
	  
	  if (args.length == 1)
	  {
	   System.err.println("Usage: java "+ this.getClass().getName()+
	   " PDF_Filename");
	   System.exit(1);
	  }

//	  pdfFilename = args[0].trim();
	  this.createPDF(pdfFilename+".pdf");
	  
}

public static void main(String[] args) {
   GeneraPresupuesto gi = new GeneraPresupuesto(args);

 }

 private void createPDF (String pdfFilename){

  Document doc = new Document();
  PdfWriter docWriter = null;
  initializeFonts();

  try {
   String path = pdfFilename;
   docWriter = PdfWriter.getInstance(doc , new FileOutputStream(path));
   doc.addAuthor("Centis, Luciano");
   doc.addCreationDate();
   doc.addProducer();
   doc.addCreator("Código Ternario");
   doc.addTitle("Presupuesto");
   doc.setPageSize(PageSize.A4);

   doc.open();
   PdfContentByte cb = docWriter.getDirectContent();
   
   boolean beginPage = true;
   yLineaDesc = 0;
//   int y = 0;
   
//   for(int i=0; i < 9; i++ ){
	    if(beginPage){
		     beginPage = false;
		     generateLayout(doc, cb); 
		     generateHeader(doc, cb);
//		     y = 585; 
		     yLineaDesc = 585;
	    }
	    generateDetail(doc, cb);
	    yLineaDesc -= 15;
	    if(yLineaDesc < 30){
		     printPageNumber(cb);
		     doc.newPage();
		     beginPage = true;
	    }
//   }
   printPageNumber(cb);

  }
  catch (DocumentException dex)
  {
	  dex.printStackTrace();
  }
  catch (Exception ex)
  {
	  ex.printStackTrace();
  }
  finally
  {
	   if (doc != null)
	   {
		   doc.close();
	   }
	   if (docWriter != null)
	   {
		   docWriter.close();
	   }
  }
 }

 private void generateLayout(Document doc, PdfContentByte cb)  {

  try { //DIBUJO CONTORNO DE PRESUPUESTO

   cb.setLineWidth(1f);
   int xIni, yIni, xSize, ySize;
   xSize = 500;
   ySize = 120;
   xIni = 50;
   yIni = 680;
   // Invoice Header box layout

   cb.rectangle(xIni,yIni,xSize,ySize);
   cb.moveTo((xIni + xSize/2 - 15), yIni);
   cb.lineTo((xIni + xSize/2 - 15), yIni+ySize);
   cb.moveTo((xIni + xSize/2 + 30), yIni);
   cb.lineTo((xIni + xSize/2 + 30), yIni+ySize);

   cb.stroke();
   yIni -= 3; 
   ySize = 50;
   yIni -= ySize;
   
   cb.rectangle(xIni,yIni,xSize,ySize);

   // Invoice Detail box layout 
   yIni -= 3;
   ySize = 460;
   yIni -= ySize;
   
   cb.rectangle(xIni,yIni,xSize,ySize);
   xIni += 45;
   cb.moveTo(xIni, yIni);
   cb.lineTo(xIni, ySize+yIni);
   xIni += 400;
   cb.moveTo(xIni, yIni);
   cb.lineTo(xIni, ySize+yIni);
   int yH = ySize + yIni - 20;
   int xH = 50;
   cb.moveTo(xH, yH);
   cb.lineTo(xH + xSize, yH);
   yH -= ySize - 40;
   cb.moveTo(xH, yH);
   cb.lineTo(xH + xSize, yH);
   
   yH -= 70;
   xH += 400;
   cb.moveTo(xH, yH);
   cb.lineTo(xH + 100, yH);
   
   cb.stroke();

   // Invoice Detail box Text Headings COLUMNAS DETALLES PRESUPUESTO
   int y = 610;
   createHeadings(cb,54,y,"Cantidad");
   createHeadings(cb,100,y,"Descripción");
   createHeadings(cb,500,y,"Precio");

   //add the images
//   Image companyLogo = Image.getInstance("src/Pruebas/olympics_logo.gif");
//   companyLogo.setAbsolutePosition(25,700);
//   companyLogo.scalePercent(25);
//   doc.add(companyLogo);
  } //catch de la carga de imagen
//  catch (DocumentException dex){
//   dex.printStackTrace();
//  }
  catch (Exception ex){
   ex.printStackTrace();
  }

 }
 
 private void generateHeader(Document doc, PdfContentByte cb)  {

  try { //GENERAR ENCABEZADO DE PRESUPUESTO.
	  
   createHeadings(cb,55,780,"Electrónica Mitre");
   createHeadings(cb,55,765,"Mitre 721");
   createHeadings(cb,55,750,"Malabrigo (Santa Fe)");
   createHeadings(cb,55,735,"CP 3572");
   createHeadings(cb,55,720,"03482-15500444");
  
   String date = Validacion.getFechaActualPresupuesto();
   createHeadings(cb,500,785,date);
   
   createHeadings(cb,55,660,"Cliente:");
   createHeadings(cb,55,640,"Dirección:");
   createHeadings(cb,300,660,"Vehículo:");
   createHeadings(cb,300,640,"Fecha emisión:");
   
   createHeadings(cb,350,770,"* Inyección electrónica.");
   createHeadings(cb,350,755,"* Escaneo - diagnóstico.");
   createHeadings(cb,350,740,"* Motores de arranque.");
   createHeadings(cb,350,725,"* Alternadores.");
   
   createHeadings(cb,460,170,"Total:");
   createHeadings(cb,490,100,"Firma");
   
   
   int xPr = 305;
   int yPr = 790;
   int descuento = 10;
   createHeadings(cb, xPr, yPr, "P"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "R"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "E"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "S"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "U"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "P"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "U"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "E"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "S"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "T"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "O"); 
  }

  catch (Exception ex){
   ex.printStackTrace();
  }

 }
 
 private void generateDetail(Document doc, PdfContentByte cb)  {
  DecimalFormat df = new DecimalFormat("0.00");
  
  Presupuesto p;
  p = PresupuestoLogica.getByid(4);
  Dueno d = DuenoLogica.getById(p.getIdduenio());
  Cliente c = ClienteLogica.getById(d.getIdcliente());
  Vehiculo v = VehiculoLogica.getById(d.getIdvehiculo());
  
  try {	 
	  String nomYAp = c.getApellido()+", "+c.getNombre();
	  String dir = c.getDireccion();
	  String vehiculo = v.getMarca()+", "+v.getModelo()+", "+d.getPatente();
	  
	  
	  createContent(cb, 100, 660, nomYAp, PdfContentByte.ALIGN_LEFT);
	  createContent(cb, 100, 640, dir, PdfContentByte.ALIGN_LEFT);	  
	  createContent(cb, 360, 660, vehiculo, PdfContentByte.ALIGN_LEFT);
	  createContent(cb, 360, 640, p.getFechaemision().toString(), PdfContentByte.ALIGN_LEFT);
	  
	  int xIni;	  
	  xIni = 110;
	  		  
	  int price = p.getImporte();
	  createContent(cb, 70, yLineaDesc, "1", PdfContentByte.ALIGN_LEFT);
	  createContent(cb,510,yLineaDesc, df.format(price),PdfContentByte.ALIGN_LEFT);
	  createContent(cb,510,170, df.format(price),PdfContentByte.ALIGN_LEFT);
	  
	  String str= p.getTrabajos();
	  StringTokenizer token = new StringTokenizer(str);
	  String aux, word;
	  aux = "";
		  
	  while (token.hasMoreElements()) {
		  do{
			  word = token.nextElement().toString();
			  System.out.println(word);
			  
			  aux += " "+word.toString();
			  	
		  }				  
	  while((aux.length()+word.length()+1 < 100) && token.hasMoreElements());
		  createContent(cb,xIni,yLineaDesc,aux,PdfContentByte.ALIGN_LEFT);		
			  
	      yLineaDesc -= 15;
		  aux = "";				
		}      
  }

  catch (Exception ex){
   ex.printStackTrace();
  }

 }

 private void createHeadings(PdfContentByte cb, float x, float y, String text){
  cb.beginText();
  cb.setFontAndSize(bfBold, 8);
  cb.setTextMatrix(x,y);
  cb.showText(text.trim());
  cb.endText(); 
 }
 
 private void printPageNumber(PdfContentByte cb){


  cb.beginText();
  cb.setFontAndSize(bfBold, 8);
  cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "Pagina N°. " + (pageNumber+1), 570 , 25, 0);
  cb.endText(); 
  
  pageNumber++;
  
 }
 
 private void createContent(PdfContentByte cb, float x, float y, String text, int align){


  cb.beginText();
  cb.setFontAndSize(bf, 8);
  cb.showTextAligned(align, text.trim(), x , y, 0);
  cb.endText(); 

 }

 private void initializeFonts(){


  try {
   bfBold = BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
   bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

  } catch (DocumentException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }


 }

}
